package com.baor.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baor.dao.CustomerDao;
import com.baor.dao.DeliveryRecordDao;
import com.baor.dao.EquipmentvoDao;
import com.baor.domain.CustomerVO;
import com.baor.domain.DeliveryRecordVO;
import com.baor.domain.EquipmentVO;
import com.baor.service.DeliveryRecordService;
import com.baor.util.R;
import com.baor.util.UploadUtil;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class DeliveryRecordServiceImpl implements DeliveryRecordService {

    @Autowired
    private DeliveryRecordDao deliveryRecordDao;

    @Autowired
    private EquipmentvoDao equipmentDao;
    @Autowired
    private CustomerDao customerDao;

    @Autowired
    private UploadUtil uploadUtil;  // 注入上传工具类

    @Override
    public R deliveryRecordList(Map<String, Object> params) {
        try {
            // 获取分页参数
            int pageIndex = params.get("pageIndex") != null ? Integer.parseInt(params.get("pageIndex").toString()) : 1;
            int pageSize = params.get("pageSize") != null ? Integer.parseInt(params.get("pageSize").toString()) : 10;
            Page<Map<String, Object>> page = new Page<>(pageIndex, pageSize);
            // 构建联表查询条件
            MPJLambdaWrapper<DeliveryRecordVO> wrapper = new MPJLambdaWrapper<>();
            wrapper.selectAll(DeliveryRecordVO.class)
                    // 关联用户表字段
                    .select(CustomerVO::getNickname, CustomerVO::getPhone,CustomerVO::getId)
                    // 关联设备表字段
                    .select(EquipmentVO::getCode, EquipmentVO::getAddress)
                    // 左联用户表
                    .leftJoin(CustomerVO.class, CustomerVO::getId, DeliveryRecordVO::getUserId)
                    // 左联设备表
                    .leftJoin(EquipmentVO.class, EquipmentVO::getId, DeliveryRecordVO::getEquipmentId)
                    // 按投递时间倒序
                    .orderByDesc(DeliveryRecordVO::getDeliveryTime);
            // 多条件搜索过滤
            // 用户id搜索
            if(params.get("id") != null){
                wrapper.like(CustomerVO::getId, params.get("id"));
            }
            if (params.get("nickname") != null && !params.get("nickname").toString().trim().isEmpty()) {
                wrapper.like(CustomerVO::getNickname, params.get("nickname").toString().trim());
            }
            // 手机号搜索
            if (params.get("phone") != null && !params.get("phone").toString().trim().isEmpty()) {
                wrapper.like(CustomerVO::getPhone, params.get("phone").toString().trim());
            }
            // 设备编号搜索
            if (params.get("deviceCode") != null && !params.get("deviceCode").toString().trim().isEmpty()) {
                wrapper.like(EquipmentVO::getCode, params.get("deviceCode").toString().trim());
            }
            // 设备地点搜索
            if (params.get("equipmentLocation") != null && !params.get("equipmentLocation").toString().trim().isEmpty()) {
                wrapper.like(EquipmentVO::getAddress, params.get("equipmentLocation").toString().trim());
            }
            // 状态搜索
            if (params.get("status") != null) {
                wrapper.eq(DeliveryRecordVO::getDeviceStatue, params.get("status"));
            }
            // 时间区间搜索 - 开始时间
            if (params.get("startTime") != null && !params.get("startTime").toString().trim().isEmpty()) {
                wrapper.ge(DeliveryRecordVO::getDeliveryTime, params.get("startTime").toString().trim());
            }
            // 时间区间搜索 - 结束时间
            if (params.get("endTime") != null && !params.get("endTime").toString().trim().isEmpty()) {
                wrapper.le(DeliveryRecordVO::getDeliveryTime, params.get("endTime").toString().trim());
            }

            // 执行分页联表查询
            IPage<Map<String, Object>> resultPage = deliveryRecordDao.selectJoinMapsPage(page, wrapper);

            // 转换为前端需要的格式
            List<Map<String, Object>> resultList = resultPage.getRecords().stream()
                    .map(this::convertToFrontendFormat)
                    .collect(Collectors.toList());

            // 封装返回数据
            Map<String, Object> result = new HashMap<>();
            result.put("list", resultList);
            result.put("totalSize", resultPage.getTotal());
//            result.put("pages", resultPage.getPages());
            result.put("pageIndex", pageIndex);
            result.put("pageSize", pageSize);

            return R.ok(result);
        } catch (Exception e) {
            e.printStackTrace();
            return R.er("查询投递记录失败: " + e.getMessage());
        }
    }
    /**
     * 将数据库字段转换为前端需要的格式
     */
    private Map<String, Object> convertToFrontendFormat(Map<String, Object> record) {
        Map<String, Object> item = new HashMap<>();
        // 关联表字段
        item.put("nickname", record.get("nickname"));           // 用户名(来自user表)
        item.put("phone", record.get("phone"));                 // 手机号(来自user表)
        item.put("device_code", record.get("code"));            // 设备编号(来自equipment表)
        item.put("equipment_location", record.get("address"));  // 设备地点(来自equipment表)
        item.put("id", record.get("id"));
        // 投递记录本身字段
        item.put("weight", record.get("weight"));               // 投递重量(kg)
        item.put("initial_weight", record.get("initial_weight")); // 起始重量(kg)
        item.put("final_weight", record.get("final_weight"));   // 结束重量(kg)
        item.put("integral", record.get("integral"));           // 积分
        item.put("reward", record.get("reward"));               // 金额(元)
        item.put("delivery_time", record.get("delivery_time")); // 投递时间
        item.put("device_statue", record.get("device_statue"));
        item.put("review_time", record.get("review_time"));
        item.put("reviewer", record.get("reviewer"));
        item.put("reason", record.get("reason"));
        item.put("change_type", record.get("change_type"));
        item.put("image", record.get("image"));
        item.put("recyclingPrice", record.get("recycling_price"));

        // 状态转换
        item.put("status", convertDeviceStatus((Integer) record.get("device_statue"))); // 设备状态
        item.put("clearing_status", convertClearingStatus((Integer) record.get("clearing_status"))); // 清运反馈状态

        return item;
    }

    /**
     * 转换设备状态
     */
    private String convertDeviceStatus(Integer deviceStatue) {
        if (deviceStatue == null) return "未知";
        switch (deviceStatue) {
            case 0: return "正常";
            case 1: return "异常";
            case 2: return "离线";
            case 3: return "维护中";
            default: return "未知";
        }
    }
    /**
     * 转换清运反馈状态
     */
    private String convertClearingStatus(Integer clearingStatus) {
        if (clearingStatus == null) return "未知";
        switch (clearingStatus) {
            case 0: return "待反馈";
            case 1: return "已反馈";
            case 2: return "已处理";
            default: return "未知";
        }
    }


    //详情
    @Override
    public R details(Map<String, Object> params) {
        if (params.get("id") == null) {
            return R.er("投递记录ID不能为空");
        }

        try {
            Integer id = Integer.parseInt(params.get("id").toString());
            MPJLambdaWrapper<DeliveryRecordVO> wrapper = new MPJLambdaWrapper<>();
            wrapper.selectAll(DeliveryRecordVO.class)
                    // 关联用户表字段
                    .select(CustomerVO::getNickname, CustomerVO::getPhone, CustomerVO::getId)
                    // 关联设备表字段
                    .select(EquipmentVO::getCode, EquipmentVO::getAddress)
                    // 左联用户表
                    .leftJoin(CustomerVO.class, CustomerVO::getId, DeliveryRecordVO::getUserId)
                    .leftJoin(EquipmentVO.class, EquipmentVO::getId, DeliveryRecordVO::getEquipmentId)
                    .eq(DeliveryRecordVO::getId, id);

            // 执行查询获取单条记录
            Map<String, Object> record = deliveryRecordDao.selectJoinMap(wrapper);
            if (record == null) {
                return R.er("未查询到对应投递记录");
            }

            // 转换为前端需要的格式
            Map<String, Object> result = convertToFrontendFormat(record);
            return R.ok(result);
        } catch (NumberFormatException e) {
            return R.er("ID格式错误，请传入有效的数字");
        } catch (Exception e) {
            e.printStackTrace();
            return R.er("查询投递记录详情失败: " + e.getMessage());
        }
    }

    //投递编辑
    @Override
    public R updateDeliveryRecord(Map<String, Object> params) {
        try {

            if (params.get("id") == null) {
                return R.er("投递记录ID不能为空");
            }
            Integer id = Integer.parseInt(params.get("id").toString());
            Double initialWeight = params.get("initial_weight") != null ?
                    Double.parseDouble(params.get("initial_weight").toString()) : null;
            Double finalWeight = params.get("final_weight") != null ?
                    Double.parseDouble(params.get("final_weight").toString()) : null;

            DeliveryRecordVO record = deliveryRecordDao.selectById(id);
            if (record == null) {
                return R.er("投递记录不存在");
            }

            if (initialWeight != null) {
                record.setInitialWeight(initialWeight);
            }
            if (finalWeight != null) {
                record.setFinalWeight(finalWeight);
            }

            int updateCount = deliveryRecordDao.updateById(record);
            if (updateCount > 0) {
                return R.ok("更新成功");
            } else {
                return R.er("更新失败");
            }
        } catch (NumberFormatException e) {
            return R.er("参数格式错误，请检查数据类型");
        } catch (Exception e) {
            e.printStackTrace();
            return R.er("更新失败: " + e.getMessage());
        }
    }

    @Override
    public R updateDeliveryRecord2(Map<String, Object> params, MultipartFile[] files) {
        try {
            // 1. 参数校验
            if (params.get("id") == null) {
                return R.er("投递记录ID不能为空");
            }
            Integer id = Integer.parseInt(params.get("id").toString());

            // 2. 查询投递记录是否存在
            DeliveryRecordVO record = deliveryRecordDao.selectById(id);
            if (record == null) {
                return R.er("投递记录不存在");
            }

            // 3. 处理文件上传（如果有文件）
            String imagePaths = null;
            if (files != null && files.length > 0) {
                // 调用上传工具类，指定上传子路径（例如"delivery/images"）
                imagePaths = uploadUtil.uploadUtil("delivery/images", files);
                // 将图片路径保存到记录中（多个路径用逗号分隔）
                record.setImages(imagePaths);
            }

            // 4. 处理其他参数（原有逻辑）
            Integer changeType = params.get("change_type") != null ?
                    Integer.parseInt(params.get("change_type").toString()) : null;
            Double changeWeight = params.get("change_weight") != null ?
                    Double.parseDouble(params.get("change_weight").toString()) : null;
            String reason = params.get("reason") != null ?
                    params.get("reason").toString() : null;

            // 必填字段验证
            if (changeType == null) {
                return R.er("变更类型不能为空");
            }
            if (changeWeight == null) {
                return R.er("变更重量不能为空");
            }
            if (reason == null || reason.trim().isEmpty()) {
                return R.er("变更原因不能为空");
            }

            // 5. 更新记录字段
            record.setChangeType(changeType);
            record.setReason(reason);
            // 此处可根据业务需求处理changeWeight（示例：假设记录中有change_weight字段）
            // record.setChangeWeight(changeWeight);

            // 6. 执行更新
            int updateCount = deliveryRecordDao.updateById(record);
            if (updateCount > 0) {
                Map<String, Object> result = new HashMap<>();
                result.put("id", record.getId());
                result.put("imagePaths", imagePaths);  // 返回上传的图片路径
                return R.ok("更新成功"+result);
            } else {
                return R.er("更新失败");
            }
        } catch (NumberFormatException e) {
            return R.er("参数格式错误，请检查数据类型");
        } catch (Exception e) {
            e.printStackTrace();
            return R.er("更新失败: " + e.getMessage());
        }
    }



//    @Override
//    public R updateDeliveryRecord2(Map<String, Object> params) {
//        try {
//            // 参数校验
//            if (params.get("id") == null) {
//                return R.er("投递记录ID不能为空");
//            }
//
//            Integer id = Integer.parseInt(params.get("id").toString());
//            Integer changeType = params.get("change_type") != null ?
//                    Integer.parseInt(params.get("change_type").toString()) : null;
//            Double changeWeight = params.get("change_weight") != null ?
//                    Double.parseDouble(params.get("change_weight").toString()) : null;
//            String reason = params.get("reason") != null ?
//                    params.get("reason").toString() : null;
//
//            String imageUrls = params.get("imageUrls") != null ?
//                    params.get("imageUrls").toString().trim() : null;
//
//            // 必填字段验证
//            if (changeType == null) {
//                return R.er("变更类型不能为空");
//            }
//            if (changeWeight == null || changeWeight <= 0) {
//                return R.er("变更重量必须大于0");
//            }
//            if (reason == null || reason.trim().isEmpty()) {
//                return R.er("变更原因不能为空");
//            }
//
//            // 查询投递记录
//            DeliveryRecordVO record = deliveryRecordDao.selectById(id);
//            if (record == null) {
//                return R.er("投递记录不存在");
//            }
//
//            // 查询顾客信息
//            CustomerVO customer = customerDao.selectById(record.getUserId());
//            if (customer == null) {
//                return R.er("顾客信息不存在");
//            }
//
//            // 计算积分变更值 (变更重量 × 40)
//            Integer integralChange = (int) (changeWeight * 40);
//
//            // 根据变更类型处理积分
//            Integer currentPoints = customer.getPointsTotal() != null ? customer.getPointsTotal() : 0;
//            Integer newPoints;
//
//            if (changeType == 0) {
//                // 扣除积分
//                if (currentPoints < integralChange) {
//                    return R.er("顾客积分不足，当前积分：" + currentPoints + "，需要扣除：" + integralChange);
//                }
//                newPoints = currentPoints - integralChange;
//            } else if (changeType == 1) {
//                // 补偿积分
//                newPoints = currentPoints + integralChange;
//            } else {
//                return R.er("无效的变更类型，只能是0(扣除)或1(补偿)");
//            }
//
//            // 更新顾客积分
//            customer.setPointsTotal(newPoints);
//            int customerUpdateCount = customerDao.updateById(customer);
//            if (customerUpdateCount <= 0) {
//                return R.er("更新顾客积分失败");
//            }
//
//            // 更新投递记录
//            record.setChangeType(changeType);
//            record.setWeight(changeWeight);  // 使用变更重量更新重量字段
//            record.setIntegral(integralChange);
//            record.setReason(reason);
//             // 设置审核时间为当前时间
//            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//            String reviewTime = LocalDateTime.now().format(formatter);
//            record.setReviewTime(reviewTime);
//
//            // 新增：存储图片地址到投递记录
//            if (imageUrls != null && !imageUrls.isEmpty()) {
//                record.setImages(imageUrls); // 存储前端传递的图片地址
//            }
//
//            // 可以根据需要设置审核人
//            // record.setReviewer("系统管理员");
//
//            int recordUpdateCount = deliveryRecordDao.updateById(record);
//            if (recordUpdateCount > 0) {
//                String action = changeType == 0 ? "扣除" : "补偿";
//                String message = String.format("积分变更成功！%s积分：%d，变更重量：%.2fkg，原因：%s。顾客当前积分：%d",
//                        action, integralChange, changeWeight, reason, newPoints);
//                return R.ok(message);
//            } else {
//                // 如果投递记录更新失败，回滚顾客积分
//                customer.setPointsTotal(currentPoints);
//                customerDao.updateById(customer);
//                return R.er("更新投递记录失败，已回滚积分变更");
//            }
//
//        } catch (NumberFormatException e) {
//            return R.er("参数格式错误，请检查数据类型");
//        } catch (Exception e) {
//            e.printStackTrace();
//            return R.er("积分变更失败: " + e.getMessage());
//        }
//
//    }

}